package com.awg.dao.impl;

import com.awg.dao.IUserDao;
import com.awg.vo.User;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 查询用户的相关信息接口的实现类
 *
 * @author awg
 * @date 2020-02-23
 * @version 1.0
 */
@Repository
public class UserDaoImpl implements IUserDao {

	@Resource
	private JdbcTemplate jdbcTemplate;

	/**
	 * 通过用户名到数据库中获取用户对象
	 *
	 * @param username 用户名
	 * @return 通过用户名在数据库中获得的用户对象
	 */
	@Override
	public User getUserByUserName(String username) {
		String usersSql = "SELECT username,password FROM users WHERE username = ?";
		List<User> users = jdbcTemplate.query(usersSql, new String[]{username}, (resultSet, i) -> {
			User user = new User();
			user.setUsername(resultSet.getString("username"));
			user.setPassword(resultSet.getString("password"));
			return user;
		});
		// 集合为空则返回空, 否则返回第一条数据(用户名一般不允许重复)
		if (CollectionUtils.isEmpty(users)) {
			return null;
		}
		return users.get(0);
	}

	/**
	 * 通过用户名从数据库或者缓存中获取用户的角色信息
	 *
	 * @param username 用户名
	 * @return 通过用户名在数据库或者缓存中获得的用户的角色信息
	 */
	@Override
	public Set<String> findRolesByUsername(String username) {
		String rolesSql = "SELECT role_name FROM user_roles WHERE username = ?";
		List<String> roles = jdbcTemplate.query(rolesSql, new String[]{username}, (resultSet, i) ->
			resultSet.getString("role_name")
		);
		if (CollectionUtils.isEmpty(roles)) {
			return null;
		}
		// 去重
		return new HashSet<>(roles);
	}

	/**
	 * 通过用户名从数据库或者缓存中获取用户的角色信息所对应的权限信息
	 *
	 * @param username 用户名
	 * @return 通过用户名在数据库或者缓存中获得的用户的角色信息所对应的权限信息
	 */
	@Override
	public Set<String> findPermissionsByUsername(String username) {
		String permissionsSql = "SELECT permission FROM roles_permissions WHERE role_name IN (SELECT role_name FROM user_roles WHERE username = ?)";
		List<String> permissions = jdbcTemplate.query(permissionsSql, new String[]{username}, (resultSet, i) ->
			resultSet.getString("permission")
		);
		if (CollectionUtils.isEmpty(permissions)) {
			return null;
		}
		// 去重
		return new HashSet<>(permissions);
	}
}
